package com.me.singleton;

/**
 * @author inttom
 * @date 2022/2/12
 * 起到了Lazy Loading的效果,但是只能在单线程下使用
 * 多线程的时候,当一个线程进入了if(singleton == null)判断语句块,还未来的及往下执行,另一个线程也通过了这个判断语句,这是便会生成多个实例
 * 所以在多线程环境下不可以使用这种方式
 * <p>
 * 结论: 在实际开发中,不要使用这种方式
 */
public class SingletonTest03 {
    public static void main(String[] args) {
        new Thread(new MyThread()).start();
        new Thread(new MyThread()).start();
    }
}

class MyThread implements Runnable {

    @Override
    public void run() {
        Singleton3 instance = Singleton3.getInstance();
        System.out.println(Thread.currentThread().getName() + ": " + instance.hashCode());
    }
}

/**
 * 懒汉式(线程不安全)
 */
class Singleton3 {
    private static Singleton3 instance;

    private Singleton3() {
    }

    /**
     * 提供一个静态的公有方法,当使用到该方法的时候,才会去创建 instance
     * 懒汉式
     */
    public static Singleton3 getInstance() {
        if (instance == null) {
            instance = new Singleton3();
        }
        return instance;
    }
}


